﻿using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Gollie.Controls
{
	public partial class AddOffer : AuthenticationRequiredSalesBaseUserControl
	{
		decimal credit;
		decimal price;
		int aantal;
		TimeSpan expiresAfter;
		DateTime ingangsDatum;
		DateTime stopDatum;
		string description;

		protected void Page_Load(object sender, EventArgs e)
		{

		}

		protected override void OnFirstHit(object sender, EventArgs e)
		{
			//setting attr in ascx doesn't work
			this.tbDescription.Attributes.Add("maxlength", "1024");

			string d = DateTime.Today.ToString("dd-MM-yyyy");
			this.tbValidFrom.Text = d;
		}

		protected override void OnPostBack(object sender, EventArgs e)
		{
			StringCollection errors = this.ValidateAndRegister();
			if (errors.Count > 0)
			{
				StringBuilder str = new StringBuilder();
				str.Append("Het formulier bevat de volgende fouten:");
				str.Append("<ul>");
				foreach (string err in errors)
				{
					str.Append("<li>");
					str.Append(err);
					str.Append("</li>");
				}
				str.Append("</ul");

				this.ErrorMessageControlTotal.Text = str.ToString();
				this.ErrorMessageControlTotal.Show();
			}
		}

		private StringCollection ValidateAndRegister()
		{
			StringCollection errors = new StringCollection();

			try
			{
				credit = this.tbCredit.DecimalValue;
				if (credit <= 0)
					errors.Add("Tegoedbedrag mag niet 0 zijn");
			}
			catch (FormatException)
			{
				errors.Add("Tegoedbedrag foutief formaat (000,00)");
			}

			try
			{
				price = this.tbPrice.DecimalValue;
				if (price <= 0)
					errors.Add("Tegoedbedrag mag niet 0 zijn");

				if (price > 0 && credit > 0 && price >= credit)
					errors.Add("Tegoedbedrag moet groter zijn dan de prijs");
			}
			catch (FormatException)
			{
				errors.Add("Prijs foutief formaat (000,00)");
			}

			try
			{
				aantal = this.tbNumbermax.IntValue;
				if (aantal < 0)
					errors.Add("Het maximum aantal moet groter of gelijk zijn aan 0");
			}
			catch (FormatException)
			{
				errors.Add("Maximum aantal foutief formaat");
			}

			try
			{
				int expiresAfterDays = Convert.ToInt32(this.tbTimeSpanDays.Text);
				int expiresAfterHours = Convert.ToInt32(this.tbTimeSpanHours.Text);
				expiresAfter = new TimeSpan(expiresAfterDays, expiresAfterHours, 0, 0);

				if (expiresAfter.TotalHours <= 0)
					errors.Add("De geldigheidsduur moet groter zijn dan 0 uur");

				if (expiresAfter.TotalDays > 366)
					errors.Add("De geldigheidsduur mag niet langer zijn dan één jaar");
			}
			catch (FormatException)
			{
				errors.Add("Geldigheidsduur foutief formaat");
			}

			//DateTime ingangsDatum;
			if (DateTime.TryParse(this.tbValidFrom.Text, out ingangsDatum) == false)
			{
				errors.Add("Ingangsdatum foutief formaat (dd-mm-jjjj, hh:mm)");
			}
			else
			{
				if (ingangsDatum < DateTime.Today)
				{
					errors.Add("De ingangsdatum mag niet in het verleden liggen");
				}
			}

			//DateTime stopDatum;
			if (DateTime.TryParse(this.tbValidTo.Text, out stopDatum) == false)
			{
				errors.Add("Afloop datum foutief formaat (dd-mm-jjjj)");
			}
			else
			{
				if (stopDatum <= ingangsDatum)
				{
					errors.Add("De afloopdatum moet na de ingangsdatum liggen ");
				}
			}

			description = tbDescription.Text;
			if (description.Length > 128)
			{
				errors.Add("De extra informatie bevat " + description.Length.ToString() + "karakters. Het maximum is echter 128 karakters");
			}

			if (errors.Count == 0)
			{
				this.pnlForm.Visible = false;
				this.pnlSummary.Visible = true;
				//Database.Queries.InsertOffer((ulong)this.UserInfo.Id, credit, price, aantal, expiresAfter, ingangsDatum, stopDatum, description);

				this.lblBonus.Text = ObjectFormatter.GetPercentage(((credit - price) / price));
				this.lblCredit.Text = ObjectFormatter.GetCurrencyString(credit);
				this.lblDescription.Text = description;
				this.lblExpirationPeriod.Text = ObjectFormatter.GetDurationString(expiresAfter);
				this.lblNumber.Text = (aantal == 0 ? "Onbeperkt" : aantal.ToString());
				this.lblPrice.Text = ObjectFormatter.GetCurrencyString(price);
				this.lblValidFrom.Text = ObjectFormatter.GetFormattedTimeStampNoSeconds(ingangsDatum);
				this.lblValidTo.Text = ObjectFormatter.GetDateString(stopDatum);
			}

			return errors;
		}

		protected void Button2_Click(object sender, EventArgs e)
		{
			Database.Queries.InsertOffer((ulong)this.UserInfo.Id, credit, price, aantal, expiresAfter, ingangsDatum, stopDatum, HttpUtility.HtmlEncode(description));

			this.Response.Redirect("/MyVendorOffers.aspx");
		}

		protected void Button3_Click(object sender, EventArgs e)
		{
			this.pnlForm.Visible = true;
			this.pnlSummary.Visible = false;
		}
	}
}